package network;

import java.io.*;
import java.net.*;

public class Token {

	final int id = 4;
	int Valjeton = 4;

	public Token(){
		
	}
	public static void main(String[] args) {
	
		try	{
			Token jeton = new Token();
			new TokenR(jeton);
			new TokenS(jeton);
		
		}catch (Exception e){}
		
	}
}





//...Classe pour recevoir un message...
//...Cette classe sera utilisée pour envoyer un jeton sur un anneau...
class TokenR implements Runnable {

	static final int portjetonR = 8900;
	private Token Jeton;
	
	
	//***Constructeur du Thread*
	TokenR(Token jet){
		Jeton = jet;
		Thread t = new Thread(this);
		t.start();
		// System.out.println("Reception activée...");
	}
	
	public void run(){
		
	try	{
	
		ServerSocket SocTokenR = new ServerSocket(portjetonR);
		
		Socket SocClient = SocTokenR.accept(); // le client accepte une connexion
		
		
		// Flux d'entrée du contenu du fichier depuis le serveur
		BufferedReader in = new BufferedReader(new InputStreamReader(SocClient.getInputStream()));
		
		int valeur = in.read()-48;
		System.out.println(valeur);
		
		if (valeur == Jeton.id){
			System.out.println("-- ALGORITHME DE CHANG & ROBERTS --");
			System.out.println("je suis élu !");
		}
		
		if (valeur > Jeton.Valjeton)
		{
		Jeton.Valjeton = valeur;
		}
		else
		{
		Jeton.Valjeton = Jeton.id;
		}
	
	}catch (Exception e){new TokenR(Jeton);}
	
	finally
	{
	new TokenR(Jeton);
	}
}

} //... FIN ...

// *** Cette classe est utilisée pour envoyer le jeton sur l'anneau
class TokenS implements Runnable {

	static final int portjetonS = 8909;
	
	private Token Jeton;
	
	//*** Constructeur de la Thread
	TokenS(Token jet)
	{
	Jeton = jet;
	Thread t = new Thread(this);
	t.start();
	System.out.println("Emission activée...");
	}
	
	
	public void run()	{
		try	{
		
			Socket SocTokenS = new Socket ("10.128.130.173", portjetonS);
			
			// Flux de sortie pour envoyer le nombre ValServ au serveur suivant
			PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(SocTokenS.getOutputStream())));
			
			out.println(Jeton.Valjeton);
			//out.println(1);
			out.flush();
		}catch (Exception e){}
		
		finally	{
			new TokenS(Jeton);
		}
	}
}